AWS ParallelCluster 環境で学ぶ Enroot の基本操作とPyxis 活用方法

AWS ParallelCluster 環境で学ぶ Enroot の基本操作とPyxis 活用方法

Clock Icon2024.10.14

AWS ParallelCluster 環境において、Enroot と Slurm を組み合わせたコンテナ実行方法を検証した結果を紹介します。本記事では、Enroot の基本的な使用方法から始め、Slurm との連携、Pyxis を利用した場合の実行方法を段階的に解説していきます。

検証環境

本検証の主な目的は以下の 2 点です。

  1. Enroot の基本的な操作方法の理解
  2. Pyxis 利用によるメリットの検証
項目 バージョン 備考
AWS ParallelCluster 3.11.0 -
OS Ubuntu 22.04 -
Slurm 23.11.10 sinfo -V
Enroot 3.4.1 enroot version
Pyxis Unknown 調べ方がわかりませんでした

Enroot 及び、Pyxis は ParallelCluster 3.11.0 から標準サポートされました。

https://dev.classmethod.jp/articles/aws-parallelcluster-3110-adds-container-based-workload-support/

enroot でコンテナを実行してみる

Enroot は、特権が不要なコンテナランタイムで、HPC 環境での利用に適しています。ここでは、cowsay イメージを例に、Enroot の基本的な使用方法を説明します。各ステップを詳しく見ていきましょう。

https://www.slideshare.net/slideshow/enrootpyxis/226847343

実行環境

ヘッドノードで試します。Slurm を使ったコンピュートノードで enroot コンテナ実行は後半で紹介します。

イメージ作成

まず、DockerHub から cowsay のイメージをインポートします。Docker コンテナイメージが.sqsh形式のファイルになって保存されます。docker pullしたコンテナイメージがファイルとして保存されるといった感じです。

$ enroot import docker://chuanwen/cowsay
[INFO] Querying registry for permission grant
[INFO] Authenticating with user: <anonymous>
[INFO] Authentication succeeded
[INFO] Fetching image manifest list
--- 省略 ---

$ ls
chuanwen+cowsay.sqsh

cowsayという名前をつけて enroot 用のイメージを作成します。

$ enroot create --name cowsay chuanwen+cowsay.sqsh

イメージが作成するとenroot listコマンドで確認できます。docker images的なものです。システム上で利用可能なコンテナイメージを表示してくれます。

$ enroot list
cowsay

コンテナ実行

作成したイメージはenroot startコマンドで実行可能です。docker run --rm的なものです。Enroot は実行終了時に自動的にコンテナを停止してくれます。

$ enroot start cowsay
 _________________________________________
/ "Only a brain-damaged operating system  \
| would support task switching and not    |
| make the simple next step of supporting |
| multitasking."                          |
|                                         |
\ -- George McFry                         /
 -----------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

コマンドやオプションを指定して実行できます。cowsayコマンド自体はフルパスで/usr/games/cowsay指定しないとエラーになりました。イメージ名を cowsay としたため、非常にわかりづらい例となってしまいました。

$ enroot start cowsay /usr/games/cowsay -f dragon "I am a dragon."
 ______________
< I am a dragon. >
 --------------
      \                    / \  //\
       \    |\___/|      /   \//  \\
            /0  0  \__  /    //  | \ \
           /     /  \/_/    //   |  \  \
           @_^_@'/   \/_   //    |   \   \
           //_^_/     \/_ //     |    \    \
        ( //) |        \///      |     \     \
      ( / /) _|_ /   )  //       |      \     _\
    ( // /) '/,_ _ _/  ( ; -.    |    _ _\.-~        .-~~~^-.
  (( / / )) ,-{        _      `-.|.-~-.           .~         `.
 (( // / ))  '/\      /                 ~-. _ .-~      .-~^-.  \
 (( /// ))      `.   {            }                   /      \  \
  (( / ))     .----~-.\        \-'                 .~         \  `. \^-.
             ///.----..>        \             _ -~             `.  ^-`  ^-_
               ///-._ _ _ _ _ _ _}^ - - - - ~                     ~-- ,.-~
                                                                  /.-~

その他

イメージのインポート時に任意の名前付けて保存

enroot import 実行時に--outputでファイルの保存名を指定できます。

$ enroot import --output my_cowsay docker://chuanwen/cowsay

デフォルトは「リポジトリ名 + イメージ名 + .sqsh」で保存されました。任意の名前を付けて保存もできます。

$ ls -lh | grep cowsay
-rw-r--r-- 1 ubuntu ubuntu 163M Oct 14 01:30 chuanwen+cowsay.sqsh
-rw-r--r-- 1 ubuntu ubuntu 163M Oct 14 02:17 my_cowsay

Slurm を使って enroot コンテナを実行してみる

Slurm は、HPC 環境で広く使用されているジョブスケジューラーです。ここでは、Slurm と Enroot を組み合わせて、コンテナを利用したジョブを実行する方法を紹介します。本セクションでは以下の 2 つのアプローチを比較します。

  1. Pyxis を利用しない基本的な実行方法
  2. Pyxis を利用した効率的な実行方法

この比較を通じて、Pyxis の利点を調べます。

Pyxis を利用しない基本的な実行方法

Slurm を使って愚直に enroot コンテナを実行するスクリプトを作成しました。enroot createでイメージを作成しないとコンテナ実行に失敗するため enroot のイメージを作成しています。その影響でイメージ作成ログが標準出力に出力され、実行結果が見づらかったので/dev/nullに今回は捨てています。

#!/bin/bash

#SBATCH -p p2
#SBATCH -n 1

# コンテナイメージのパスを指定
CONTAINER_IMAGE=${PWD}/chuanwen+cowsay.sqsh

# Enrootを使用してコンテナを作成
CONTAINER_NAME="cowsay_container"
enroot create --name ${CONTAINER_NAME} ${CONTAINER_IMAGE} > /dev/null 2>&1

# コンテナを起動し、コマンドを実行
srun enroot start --mount ${PWD}:/workspace ${CONTAINER_NAME} \
    /usr/games/cowsay "Hello from Slurm job!"

enroot コンテナをローカルで実行したときの流れをそのままスクリプトにしたかたちです。

実行結果

sbatchでジョブをサブミットした結果です。無事実行できました。

$ cat slurm-14.out
 _______________________
< Hello from Slurm job! >
 -----------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Pyxis を利用した効率的な実行方法

Pyxis の利点が知りたく Pyxis を使うとスクリプトをどのように書けるのか試してみました。記述方法は Pytourch の実行サンプルをベースに、Pyxis を利用しない実行方法との差分から洗い出しました。

https://github.com/aws-samples/awsome-distributed-training/blob/main/3.test_cases/16.pytorch-cpu-ddp/slurm/3.container-train.sbatch

コンテナ引数の定義
--container-image--container-mounts オプションを使用して、コンテナの設定を直接 srun コマンドに渡せました。

イメージの作成が不要
enroot create ステップが不要になり、スクリプトがシンプルになりました。

srun の記述がシンプル
enroot startすら記述せずに、コンテナイメージの指定と、コンテナ上のコマンドを実行する形式で記述できました。

#!/bin/bash

#SBATCH -p p2
#SBATCH -n 1

# コンテナイメージのパスを指定
CONTAINER_IMAGE=${PWD}/chuanwen+cowsay.sqsh

# コンテナ引数を定義
declare -a CONTAINER_ARGS=(
    --container-image ${CONTAINER_IMAGE}
    --container-mounts ${PWD}:/workspace
)

# 実行するコマンドとそのパラメータを定義
COMMAND="/usr/games/cowsay"
COMMAND_ARGS="Hello from Slurm job!"

# srunを使用してコンテナ内でコマンドを実行
srun "${CONTAINER_ARGS[@]}" ${COMMAND} "${COMMAND_ARGS}"

実行結果

sbatchでジョブをサブミットした結果です。こちらも無事実行できました。

~$ cat slurm-6.out
 _______________________
< Hello from Slurm job! >
 -----------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

考察

Pyxis の利用により、以下の利点がありました。

  1. スクリプトの簡素化: sbatch で投げるスクリプトの記述が全体的に簡略化されました。
  2. イメージ作成プロセスの省略: enroot create ステップが不要になりました。
  3. srun コマンドの簡潔化: コンテナ関連のオプションが直接 srun に統合され、実行コマンドが直感的になりました。

これらの利点により、Slurm を利用する HPC 環境においてはコンテナ実行のユーザー体験は良くなります。

まとめ

本記事では、AWS ParallelCluster 環境における Enroot と Slurm の連携について確認しました。主なポイントは以下の通りです。

  1. Enroot の基本的な使用方法(イメージのインポート、作成、実行)
  2. Slurm を使用した Enroot コンテナの実行方法
  3. Pyxis を活用した効率的なコンテナ実行

Pyxis の導入により、Slurm を利用する環境下でコンテナを実行するのが楽になることを実感できました。Pyxis のプラグインをユーザー側で導入するなら一考の余地はあるかもしれないですが、ParallelCluster 3.11.0 でデフォルトで動作環境が整っているので使っていきましょう。

おわりに

本記事の検証を通じて、AWS ParallelCluster 環境における Enroot、Slurm、そして Pyxis を利用することの意味がわかりました。これらのツールを組み合わせることで、HPC 環境でのコンテナ利用がより効率的かつ管理しやすくなります。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.